// Avi.cpp: implementation of the CAvi class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Avi.h"

//#ifdef _DEBUG
//#undef THIS_FILE
//static char THIS_FILE[]=__FILE__;
//#define new DEBUG_NEW
//#endif

//#include "AviFileStm.h"
//#include "AviFileAtm.h"
//#include "AviFile65xx.h"
//#include "AviFileV6.h"
//#include "AviFileM65.h"
#include "AviFileAsf.h"

#define DVR_6500_FILETYPE	".mad"
#define DVR_MDVR_FILETYPE	".car"
#define DVR_STM_FILETYPE	".stm"
#define DVR_6214_FILETYPE	".atm"
#define DVR_M65_FILETYPE	".m65"
#define DVR_ASF_FILETYPE	".asf"
#define DVR_SGF_FILETYPE	".sgf"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CAvi::CAvi()
{
	m_pAviFile = NULL;
}

CAvi::~CAvi()
{
	StopChange();
	DeleteAviFile();
}

//---------------------------------------------------------------------------
//说明：准备转换，打开文件，取得文件的信息，其中包括制式，分辨率，帧率和文件长度
//		和文件的类型，最终转换成文件的个数
//参数：[in]strSFile:源文件的名称
//		[in]iFileCount:转换完后，有多少个文件
//返回：成功返回TRUE，失败返回FALSE
//---------------------------------------------------------------------
BOOL CAvi::PrepareChange(char *szFile, int& iFileCount)
{
	if(m_pAviFile && m_pAviFile->GetChanging())
	{
		return FALSE;
	}
	
	DeleteAviFile();

	if(!szFile)
	{
		return FALSE;
	}

	int iLen = strlen(szFile);
	if(iLen <= 4)
	{
		return FALSE;
	}
	
	if(0 == strncmp(szFile+iLen - 4, DVR_ASF_FILETYPE, strlen(DVR_ASF_FILETYPE)) ||
		0 == strncmp(szFile+iLen - 4, DVR_SGF_FILETYPE, strlen(DVR_ASF_FILETYPE)))
	{
		m_pAviFile = new CAviFileAsf();
	}

	if(m_pAviFile)
	{
		return m_pAviFile->OpenFile(szFile, iFileCount);
	}

	return FALSE;
}

//---------------------------------------------------------------------------
//说明：开始转换
//		和文件的类型，最终转换成文件的个数
//参数：[in]szFile:文件名称，必须为绝对路径
//		[out]iFileNum:转换后的文件数目
//		[in]iChangeType:转换类型，可以选择转转换成avi，
//		也可以选择转换成mpeg，0表示转换成avi，1表示转换成mpeg
//		[in]szFolder:转换后的文件存放的目录，必须为绝对路径
//		转换后文件名规则，如果是转换后的文件个数为1个，则为原来的文件名加上后缀名AVI
//		如果是多个文件则转换后的文件名为原来的文件名后加上文件的序号eg:111111.mad
//		转换后为111111_1.avi,111111_2.avi,111111_3.avi,111111_4.avi
//		[in]hWnd:接收消息的窗口
//		[in]nMsgID:消息ID
//		系统在转换的过程中会不停的向窗口，发送完成的百分比信息
//返回：成功返回TRUE，失败返回FALSE
//---------------------------------------------------------------------
BOOL CAvi::StartChange( char* szFile, int* iFileNum, char* szFolder, 
					   HWND hwnd, UINT nMsgID, int iChangeType, BOOL bIsAudio, BOOL bIsBlock)
{
	if(PrepareChange(szFile, *iFileNum) && SetChangeType(iChangeType))
	{
		return m_pAviFile->StartChange(szFolder, hwnd, nMsgID, bIsAudio, bIsBlock);
	}
	return FALSE;
}

//---------------------------------------------------------------------------
//说明：结束转换，如果转换过程中需要停止转换，则调用此接口
//		和文件的类型，最终转换成文件的个数
//参数：[in]strSFile:源文件的名称
//		[in]iFileCount:转换完后，有多少个文件
//返回：成功返回TRUE，失败返回FALSE
//---------------------------------------------------------------------
BOOL CAvi::StopChange()
{
	if(m_pAviFile&&m_pAviFile->GetChanging())
	{
		m_pAviFile->StopChange();
		return TRUE;
	}
	return FALSE;
}

//---------------------------------------------------------------------------
//说明：设置转换类型,如果不调用则默认转换成AVI
//参数：[in]iType:0表示转换成AVI,1表示转成其它格式
//返回：成功返回TRUE，失败返回FALSE
//---------------------------------------------------------------------
BOOL CAvi::SetChangeType(int iType)
{
	if(m_pAviFile)
	{
		return m_pAviFile->SetChangeType(iType);
	}
	return FALSE;
}

//---------------------------------------------------------------------------
//说明：删除AVIFILE文件对象
//参数：无
//返回：成功返回TRUE，失败返回FALSE
//---------------------------------------------------------------------
BOOL CAvi::DeleteAviFile()
{
	if(m_pAviFile)
	{
		delete m_pAviFile;
		m_pAviFile = NULL;
		return TRUE;
	}
	return FALSE;
}